﻿using Library.AppWeb;
using MPR.Poker.DALEntity.SYS;
using MPR.Poker.Model.LIS;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MPR.Poker.DALEntity.LIS
{
    public class DAL_Province
    {
        public DAL_Province()
        {
        }

        #region Insert/Update/Delete

        /// <summary>
        /// Thêm Tỉnh thành
        /// </summary>
        /// <param name="objProvince"></param>
        /// <returns></returns>
        public ResultMessage Insert(LIS_Province objProvince)
        {
            ResultMessage objResultMessage = new ResultMessage();
            objResultMessage = CheckExist(objProvince);
            if (objResultMessage.IsError) return objResultMessage;

            objResultMessage = InsertNoCheck(objProvince);

            return objResultMessage;
        }

        /// <summary>
        /// Kiểm Tra Tỉnh thành Đã Tồn Tại
        /// </summary>
        /// <param name="strIDSys"></param>
        /// <param name="strProvinceID"></param>
        /// <returns></returns>
        public ResultMessage CheckExist(LIS_Province objProvince)
        {
            ResultMessage objResultMessage = new ResultMessage();
            try
            {
                using (PokerLife db = new PokerLife())
                {
                    LIS_Province Province = db.LIS_Provinces.FirstOrDefault(i => i.IsDeleted == false & i.ProvinceID == objProvince.ProvinceID & i.IDSys != objProvince.IDSys);

                    if (Province != null && Province.IDSys > 0)
                    {
                        objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.No_Error, "Tỉnh thành đã tồn tại", string.Empty);
                    }
                }
            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.CheckData, "Lỗi kiểm tra tồn tại Tỉnh thành", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_Province --> CheckExist");
                return objResultMessage;
            }
            return objResultMessage;
        }

        /// <summary>
        /// Thêm mới Tỉnh thành chưa kiểm tra tồn tại
        /// </summary>
        /// <param name="objProvince"></param>
        /// <returns></returns>
        public ResultMessage InsertNoCheck(LIS_Province objProvince)
        {
            ResultMessage objResultMessage = new ResultMessage();
            LIS_Province Province = new LIS_Province();

            try
            {
                using (PokerLife db = new PokerLife())
                {
                    
                    Province.ProvinceID = objProvince.ProvinceID;
                    Province.ProvinceName = objProvince.ProvinceName;
                    Province.CountryIDSys = objProvince.CountryIDSys;
                    Province.Note = objProvince.Note;
                    Province.OrderIndex = db.LIS_Provinces.Count() + 1;
  
                    db.LIS_Provinces.Add(Province);
                    db.SaveChanges();
                }

                objProvince.IDSys = Province.IDSys;
                DataCache.ClearDataCache.ProvinceCache();
                DAL_Event.Insert("Thêm mới Tỉnh thành - " + objProvince.ProvinceID.ToString(), 0, ResultMessage.ErrorTypes.Insert.ToString());
            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.Insert, "Lỗi thêm mới Tỉnh thành", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_Province --> Insert");
                return objResultMessage;
            }

            return new ResultMessage(false, ResultMessage.ErrorTypes.No_Error, "Thêm mới Tỉnh thành thành công", string.Empty);
        }

        /// <summary>
        /// Cập nhật Tỉnh thành
        /// </summary>
        /// <param name="objProvince"></param>
        /// <returns></returns>
        public ResultMessage Update(LIS_Province objProvince)
        {
            ResultMessage objResultMessage = new ResultMessage();
            objResultMessage = CheckExist(objProvince);
            if (objResultMessage.IsError) return objResultMessage;

            objResultMessage = UpdateNoCheck(objProvince);

            return objResultMessage;
        }

        /// <summary>
        /// Cập nhật Tỉnh thành chưa kiểm tra tồn Tại
        /// </summary>
        /// <param name="objProvince"></param>
        /// <returns></returns>
        public ResultMessage UpdateNoCheck(LIS_Province objProvince)
        {
            ResultMessage objResultMessage = new ResultMessage();
            try
            {
                using (PokerLife db = new PokerLife())
                {

                    LIS_Province Province = db.LIS_Provinces.FirstOrDefault(i => i.IDSys == objProvince.IDSys);
                    Province.ProvinceID = objProvince.ProvinceID;
                    Province.ProvinceName = objProvince.ProvinceName;
                    Province.CountryIDSys = objProvince.CountryIDSys;
                    Province.Note = objProvince.Note;

                    db.SaveChanges();
                }
                DataCache.ClearDataCache.ProvinceCache();
                DAL_Event.Insert("Cập nhật Tỉnh thành - " + objProvince.ProvinceID.ToString(),0, ResultMessage.ErrorTypes.Update.ToString());
            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.Update, "Lỗi cập nhật Tỉnh thành", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_Province --> Update");
                return objResultMessage;
            }

            return new ResultMessage(false, ResultMessage.ErrorTypes.No_Error, "Cập nhật Tỉnh thành thành công", string.Empty);
        }

        /// <summary>
        /// Xóa Tỉnh thành
        /// </summary>
        /// <param name="strIDSys"></param>
        /// <returns></returns>
        public ResultMessage Delete(LIS_Province objProvince)
        {
            ResultMessage objResultMessage = new ResultMessage();
            objResultMessage = CheckRelationship(objProvince);
            if (objResultMessage.IsError) return objResultMessage;

            objResultMessage = DeleteNoCheck(objProvince);

            return objResultMessage;
        }

        /// <summary>
        /// Xóa đơn vị tiền tệ
        /// </summary>
        /// <param name="intProvinceIDSys">Mã hệ thống đơn vị tiền tệ</param>
        /// <param name="intDeletedUser">Mã người dùng</param>
        /// <returns></returns>
        public ResultMessage Delete(int intProvinceIDSys, int intDeletedUser)
        {
            ResultMessage objResultMessage = new ResultMessage();
            LIS_Province objProvince = new LIS_Province();
            objProvince.IDSys = intProvinceIDSys;

            objResultMessage = CheckRelationship(objProvince);
            if (objResultMessage.IsError) return objResultMessage;

            objResultMessage = DeleteNoCheck(objProvince);

            return objResultMessage;
        }

        /// <summary>
        /// Xóa đơn vị tiền tệ
        /// </summary>
        /// <param name="lstProvinceIDSys">Danh sách mã hệ thông đơn vị tiền tệ</param>
        /// <param name="intDeletedUser"></param>
        /// <returns></returns>
        public ResultMessage Delete(List<int> lstProvinceIDSys, int intDeletedUser)
        {
            ResultMessage objResultMessage = new ResultMessage();
            foreach (int intIDSys in lstProvinceIDSys)
            {
                LIS_Province objProvince = new LIS_Province();
                objProvince.IDSys = intIDSys;

                objResultMessage = CheckRelationship(objProvince);
                if (objResultMessage.IsError) return objResultMessage;

                objResultMessage = DeleteNoCheck(objProvince);
                if (objResultMessage.IsError) return objResultMessage;
            }
            return objResultMessage;
        }

        /// <summary>
        /// Kiểm tra dữ liệu liên quan
        /// </summary>
        /// <param name="strIDSys"></param>
        /// <returns></returns>
        public ResultMessage CheckRelationship(LIS_Province objProvince)
        {
            ResultMessage objResultMessage = new ResultMessage();
            try
            {
               

            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.CheckData, "Lỗi kiểm tra dữ liệu liên quan Tỉnh thành", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_Province --> CheckRelationship");
                return objResultMessage;
            }
            return objResultMessage;
        }

        /// <summary>
        /// Xóa Tỉnh thành chưa kiểm tra dữ liệu liên quan
        /// </summary>
        /// <param name="strIDSys"></param>
        /// <returns></returns>
        public ResultMessage DeleteNoCheck(LIS_Province objProvince)
        {
            ResultMessage objResultMessage = new ResultMessage();
            try
            {
                using (PokerLife db = new PokerLife())
                {
                    LIS_Province Province = db.LIS_Provinces.FirstOrDefault(i => i.IDSys == objProvince.IDSys);
                    if (Province == null || Province.IDSys == 0)
                    {
                        objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.No_Error, "Tỉnh thành không tồn tại", string.Empty);
                        return objResultMessage;
                    }

                    Province.IsDeleted = true;
                    Province.DeletedDate = DateTime.Now;

                    db.SaveChanges();
                }
                DataCache.ClearDataCache.ProvinceCache();
                DAL_Event.Insert("Xóa Tỉnh thành - " + objProvince.ProvinceID.ToString(), 0, ResultMessage.ErrorTypes.Insert.ToString());

            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.Delete, "Lỗi xóa Tỉnh thành", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_Province --> DeleteNoCheck");
                return objResultMessage;
            }
            return new ResultMessage(false, ResultMessage.ErrorTypes.No_Error, "Xóa Tỉnh thành thành công", string.Empty);
        }

        #endregion

        #region Load/Search/Select

        /// <summary>
        /// Lấy thông tin Tỉnh thành
        /// </summary>
        /// <param name="objProvince"></param>
        /// <param name="strIDSys"></param>
        /// <returns></returns>
        public ResultMessage LoadInfo(ref LIS_Province objProvince, int strIDSys)
        {
            ResultMessage objResultMessage = new ResultMessage();
            try
            {
                using (PokerLife db = new PokerLife())
                {
                    var Province = from gu in db.LIS_Provinces
                                   where gu.IDSys == strIDSys
                                   select gu;
                    objProvince = new LIS_Province();
                    foreach (var obj in Province)
                    {
                        if (!Convert.IsDBNull(obj.IDSys)) objProvince.IDSys = obj.IDSys;
                        if (!string.IsNullOrEmpty(obj.ProvinceID)) objProvince.ProvinceID = obj.ProvinceID;
                        if (!string.IsNullOrEmpty(obj.ProvinceName)) objProvince.ProvinceName = obj.ProvinceName;
                        if (!Convert.IsDBNull(obj.CountryIDSys)) objProvince.CountryIDSys = obj.CountryIDSys;
                        if (!string.IsNullOrEmpty(obj.Note)) objProvince.Note = obj.Note;
                        if (!Convert.IsDBNull(obj.OrderIndex)) objProvince.OrderIndex = obj.OrderIndex;
                        if (!Convert.IsDBNull(obj.IsDeleted)) objProvince.IsDeleted = obj.IsDeleted;
                        if (!Convert.IsDBNull(obj.DeletedDate)) objProvince.DeletedDate = obj.DeletedDate;
                    }
                }
            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.LoadInfo, "Lấy thông tin Tỉnh thành", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_Province --> LoadInfo");
                return objResultMessage;
            }
            return new ResultMessage(false, ResultMessage.ErrorTypes.No_Error, "Lấy thông tin Tỉnh thành thành công", string.Empty);
        }

        /// <summary>
        /// Lấy danh sách Tỉnh thành
        /// </summary>
        /// <param name="dtProvince"></param>
        /// <returns></returns>
        public ResultMessage SearchData(ref DataTable dtProvince)
        {
            ResultMessage objResultMessage = new ResultMessage();
            dtProvince = new DataTable();

            try
            {
                using (PokerLife db = new PokerLife())
                {
                    dtProvince = ConvertData.ConvertToDataTable<LIS_Province>(db.LIS_Provinces.Where(i => i.IsDeleted == false).ToList());
                }
            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.SearchData, "Lấy thông tin Tỉnh thành", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_Province --> LoadInfo");
                return objResultMessage;
            }

            return new ResultMessage(false, ResultMessage.ErrorTypes.No_Error, "Lấy danh sách Tỉnh thành thành công", string.Empty);
        }

        /// <summary>
        /// Lấy danh sách Tỉnh thành dạng LIST
        /// </summary>
        /// <param name="lstProvince"></param>
        /// <returns></returns>
        public ResultMessage SelectToList(ref List<LIS_Province> lstProvince)
        {
            ResultMessage objResultMessage = new ResultMessage();
            try
            {
                using (PokerLife db = new PokerLife())
                {
                    var Province = from b in db.LIS_Provinces
                                   where b.IsDeleted == false
                                   orderby b.OrderIndex
                                   select b;
                    lstProvince = Province.ToList();
                }
            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.SelectData, "Lấy thông tin Tỉnh thành", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_Province --> LoadInfo");
                return objResultMessage;
            }

            return new ResultMessage(false, ResultMessage.ErrorTypes.No_Error, "Lấy danh sách Tỉnh thành thành công", string.Empty);
        }

        /// <summary>
        /// Lấy danh sách Tỉnh thành dạng List
        /// </summary>
        /// <param name="lstUserGroup">Đối tượng Tỉnh thành</param>
        /// <param name="intPageSize">Số lượng Record một trang</param>
        /// <param name="intPageNumber">Lấy trang số mấy</param>
        /// <returns></returns>
        public ResultMessage SelectToList(ref List<LIS_Province> lstProvince, int intPageSize, int intPageNumber)
        {
            ResultMessage objResultMessage = new ResultMessage();
            try
            {
                using (PokerLife db = new PokerLife())
                {
                    var Province = from gu in db.LIS_Provinces
                                   where gu.IsDeleted == false
                                   orderby gu.OrderIndex
                                   select gu;

                    lstProvince = Province.Skip((intPageNumber - 1) * intPageSize).Take(intPageSize).ToList();
                }
            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.SelectData, "Lấy thông tin Tỉnh thành", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_Province --> SelectToList");
                return objResultMessage;
            }

            return new ResultMessage(false, ResultMessage.ErrorTypes.No_Error, "Lấy danh sách Tỉnh thành thành công", string.Empty);
        }

        /// <summary>
        /// Lấy danh sách Tỉnh thành từ Cache
        /// </summary>
        /// <param name="lstProvince"></param>
        /// <returns></returns>
        public ResultMessage SelectToListCache(ref List<LIS_Province> lstProvince)
        {
            ResultMessage objResultMessage = new ResultMessage();
            objResultMessage = DataCache.GetDataCache.GetProvince(ref lstProvince);
            return objResultMessage;
        }

        public ResultMessage SelectListToCache(ref List<LIS_Province> lstProvince)
        {
            ResultMessage objResultMessage = new ResultMessage();
            try
            {
                using (PokerLife db = new PokerLife())
                {

                    IEnumerable<LIS_Province> Province = (from gu in db.LIS_Provinces
                                                          where gu.IsDeleted == false
                                                          orderby gu.OrderIndex
                                                          select new
                                                          {
                                                              IDSys = gu.IDSys,
                                                              ProvinceID = gu.ProvinceID,
                                                              ProvinceName = gu.ProvinceName,
                                                              gu.CountryIDSys,
                                                              Note = gu.Note,
                                                              OrderIndex = (Nullable<int>)gu.OrderIndex
                                                          }).ToList().Select(c => new LIS_Province()
                                                          {
                                                              IDSys = c.IDSys,
                                                              ProvinceID = c.ProvinceID,
                                                              ProvinceName = c.ProvinceName,
                                                              CountryIDSys = c.CountryIDSys,
                                                              Note = c.Note,
                                                              OrderIndex = (Nullable<int>)c.OrderIndex == null ? 0 : 0
                                                          });

                    lstProvince = Province.ToList();
                }
            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.SelectData, "Lấy Cache danh sách Tỉnh thành", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_Province --> SelectToListCache");
                return objResultMessage;
            }

            return new ResultMessage(false, ResultMessage.ErrorTypes.No_Error, "Lấy Cache danh sách Tỉnh thành thành công", string.Empty);
        }

        /// <summary>
        /// Lấy những thông tin Tỉnh thành để Cache
        /// </summary>
        /// <param name="lstProvince"></param>
        /// <returns></returns>
        public ResultMessage SelectToCache(ref List<LIS_Province> lstProvince)
        {
            ResultMessage objResultMessage = new ResultMessage();
            try
            {
                using (PokerLife db = new PokerLife())
                {

                    IEnumerable<LIS_Province> Province = (from gu in db.LIS_Provinces
                                                          where gu.IsDeleted == false
                                                          orderby gu.OrderIndex
                                                          select new
                                                          {
                                                              IDSys = gu.IDSys,
                                                              ProvinceID = gu.ProvinceID,
                                                              ProvinceName = gu.ProvinceName,
                                                              gu.CountryIDSys,
                                                              Note = gu.Note,
                                                              OrderIndex = (Nullable<int>)gu.OrderIndex
                                                          }).ToList().Select(c => new LIS_Province()
                                                          {
                                                              IDSys = c.IDSys,
                                                              ProvinceID = c.ProvinceID,
                                                              ProvinceName = c.ProvinceName,
                                                              CountryIDSys = c.CountryIDSys,
                                                              Note = c.Note,
                                                              OrderIndex = (Nullable<int>)c.OrderIndex == null ? 0 : 0
                                                          });

                    lstProvince = Province.ToList();
                }
            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.SelectData, "Lấy Cache danh sách Tỉnh thành", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_Province --> SelectToListCache");
                return objResultMessage;
            }

            return new ResultMessage(false, ResultMessage.ErrorTypes.No_Error, "Lấy Cache danh sách Tỉnh thành thành công", string.Empty);
        }

        #endregion
    }
}
